package com.luo.chengrui.module.sa.service.org;

import java.util.*;
import javax.validation.*;

import com.luo.chengrui.framework.sadatapermission.core.annotation.SaDataPermission;
import com.luo.chengrui.module.sa.api.org.dto.OrgRespDTO;
import com.luo.chengrui.module.sa.controller.admin.org.vo.*;
import com.luo.chengrui.module.sa.dal.dataobject.org.OrgDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.luo.chengrui.module.sa.dal.dataobject.org.OrgPersonDO;
import com.luo.chengrui.module.sa.enums.OrgKindEnum;

/**
 * 组织机构管理 Service 接口
 *
 * @author 诚睿
 */
public interface OrgService {
    String ORG_ROOT_ID = "root";

    /**
     * 创建组织机构管理
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createOrg(@Valid OrgCreateReqVO createReqVO);

    void batchCreatePsm(List<OrgCreateReqVO> createReqVO);

    /**
     * 更新组织机构管理
     *
     * @param updateReqVO 更新信息
     */
    void updateOrg(@Valid OrgUpdateReqVO updateReqVO);

    /**
     * 删除组织机构管理
     *
     * @param id 编号
     */
    void deleteOrg(String id);

    /**
     * 获得组织机构管理
     *
     * @param id 编号
     * @return 组织机构管理
     */
    OrgDO getOrg(String id);

    /**
     * 获得组织机构管理列表
     *
     * @param ids 编号
     * @return 组织机构管理列表
     */
    List<OrgDO> getOrgList(Collection<String> ids);

    /**
     * 获得组织机构管理分页
     *
     * @param pageReqVO 分页查询
     * @return 组织机构管理分页
     */
    PageResult<OrgDO> getOrgPage(OrgPageReqVO pageReqVO);

    /**
     * 获得组织机构管理列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 组织机构管理列表
     */
    List<OrgDO> getOrgList(OrgExportReqVO exportReqVO);

    /**
     * 获取组织机构子节点，用于OrgTree
     *
     * @param id
     * @return
     */
    List<OrgDO> getChildrenBy(String id);

    /**
     * 批量更新机构信息。
     *
     * @param updateOrgList
     */
    void batchUpdate(List<OrgDO> updateOrgList);

    /**
     * @param systemUserId 系统用户ID,system_user表主键ID
     * @return
     */
    List<OrgDO> getPsmListBySystemUserId(Long systemUserId);

    /**
     * 根据用户ID，查询用户所有岗位信息；
     *
     * @param personId
     * @return
     */
    List<OrgDO> getPsmListById(String personId);


    /**
     * 查询用户拥有的所有岗位、机构、部门数据。
     *
     * @param userId system_user表主键ID，用户账号id.
     * @param dept   查询的数据类型
     * @return
     */
    List<String> getOrgFullIdListBySystemUserId(Long userId, OrgKindEnum dept);

    /**
     * 列表查询组织机构。通过传递权限控制编码，对数据进行权限过滤。
     *
     * @param reqVo
     * @param permissionSubCode 数据权限控制编号
     * @return
     */
    List<OrgDO> getOrgAllList(OrgPageReqVO reqVo, String permissionSubCode);

    /**
     * 查询所有下级人员
     *
     * @param personFullIds 机构全路径集合
     * @return
     */
    List<OrgDO> getPsmListByFullIds(List<String> personFullIds);

    /**
     * 获取组织下级所有人员信息
     *
     * @param orgId 机构ID
     * @return
     */
    List<OrgRespDTO> getAllPersonMemberListByOrgId(String orgId);

    /**
     * 根据机构ID 同步机构与
     *
     * @param id
     */
    void syncOrg(String id);
}
